package com.blog.cmrpersonalblog.service;

import com.blog.cmrpersonalblog.dto.auth.request.ForgotPasswordRequest;
import com.blog.cmrpersonalblog.dto.auth.request.ResetPasswordRequest;
import com.blog.cmrpersonalblog.dto.auth.response.EmailVerificationResponse;

/**
 * 密码重置服务接口
 */
public interface PasswordResetService {

    /**
     * 发送密码重置邮件
     * @param request 忘记密码请求
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 发送结果
     */
    EmailVerificationResponse sendResetPasswordEmail(ForgotPasswordRequest request, 
                                                    String ipAddress, String userAgent);

    /**
     * 验证重置令牌
     * @param resetToken 重置令牌
     * @return 是否有效
     */
    boolean validateResetToken(String resetToken);

    /**
     * 重置密码
     * @param request 重置密码请求
     * @param ipAddress IP地址
     * @param userAgent 用户代理
     * @return 是否成功
     */
    boolean resetPassword(ResetPasswordRequest request, String ipAddress, String userAgent);

    /**
     * 使重置令牌失效
     * @param userId 用户ID
     * @param email 邮箱
     * @return 是否成功
     */
    boolean invalidateResetTokens(Long userId, String email);

    /**
     * 清理过期重置令牌
     * @return 清理数量
     */
    Integer cleanExpiredTokens();

    /**
     * 检查发送频率限制
     * @param userId 用户ID
     * @param email 邮箱
     * @return 是否可以发送
     */
    boolean canSendResetEmail(Long userId, String email);

    /**
     * 获取剩余发送次数
     * @param userId 用户ID
     * @param email 邮箱
     * @return 剩余次数
     */
    Integer getRemainingDailyCount(Long userId, String email);

    /**
     * 生成重置令牌
     * @return UUID格式的重置令牌
     */
    String generateResetToken();
}
